This project aims to connect floral phenology to reproductive success on the individual level for three subalpine plants. Data were collected at the Rocky Mountain Biological Laboratory during the 2019 field season. Focal species include Mertensia fusiformis, Potentilla pulcherrima, and Delphinium nuttallianum.
Our questions specifically ask: 1. how does blooming time affect seed set for individiuals in a population? 2. how do abiotic factors such as soil moisture affect individual seed set? 3. how do biotic factors such as conspecific density and pollen limitation affect individual seed set?
We tagged individuals of the three species in control and manipulated plots in eight sites across East River valley and Washington Gulch. We tracked blooming time of those tagged individuals and conducted a pollen limitation experiment with two treatments, open and pollen-supplemented. Seed set was quantified as the count of total developed seeds and proportion of developed seeds in each individual.
Because there were sources of non-independence in this study, our statistical approach involves generalized linear mixed effects models. Our models includes site as a random effect and the following fixed effects: the interaction between being before or after the population peak and deviation from the peak and the interaction between conspecific density and plot treatment. A separate model included pollen limitation treatment.
rm(list = ls()) #clearing environment
suppressWarnings(suppressPackageStartupMessages(require(knitr)))
suppressWarnings(suppressPackageStartupMessages(require(tidyverse)))
suppressWarnings(suppressPackageStartupMessages(require(lme4)))
suppressWarnings(suppressPackageStartupMessages(require(ggplot2)))
suppressWarnings(suppressPackageStartupMessages(require(RColorBrewer)))
suppressWarnings(suppressPackageStartupMessages(require(fitdistrplus)))
suppressWarnings(suppressPackageStartupMessages(require(glmmADMB)))
suppressWarnings(suppressPackageStartupMessages(require(MuMIn)))
suppressWarnings(suppressPackageStartupMessages(require(lubridate)))
suppressWarnings(suppressPackageStartupMessages(require(DHARMa)))
suppressWarnings(suppressPackageStartupMessages(require(glmmTMB)))
The imported csv files contain the following for each individual of a species: bloom start and end estimates, relative position of blooming in the community, soil moisture variables, and seed counts. These elements were compiled from five different data sets and calculated in a separate document. To view the data cleaning process, refer to the data cleaning R Markdown file, Data_Cleaning.Rmd.
The first dataset contains the individual data for Mertensia fusiformis, which was found in four of our sites. For Mertensia, we calculated the proportion of developed seeds in addition to the seed counts. We also reformatted the relative position as a deviation variable (the absolute value of the relative position) and a early/late variable (the direction of the relative position).
mert = read.csv("Mertensia_final2.csv") # read in Mertensia data
mert<-mert[!is.na(mert$relative.position),] #removing NA values from relative position column
mert<-mert[!is.na(mert$dev.seed),]
mert$prop.dev.seeds<-(mert$dev.seed/mert$total.seeds) #adding proportion of developed seeds
mert$deviation<-abs(mert$relative.position) #getting deviation from the peak
mert$early.late<-factor(NA, levels = c("early","late")) #creating early/late variables based on relative position
mert$early.late[mert$relative.position<0]<-"early"
mert$early.late[mert$relative.position>0]<-"late"
mert<-mert[!is.na(mert$early.late),]
The second dataset contains individual data for Delphinium nuttallianum. Delphinium was found in four of our sites. For Delphinium, we calculated proportion, deviation, and early/late value like we did with the Mertensia data.
delph = read.csv("Delphinium_final2.csv") # read in Delphinium data
delph<-delph[!is.na(delph$total.seeds),] #removing NA values in seed column
delph<-delph[!is.na(delph$relative.position),] #removing NA values in the relative position
delph$undev.seed1[is.na(delph$undev.seed1)] <- 0 #converting NA to 0
delph$prop.dev.seeds<-(delph$total.seeds/(delph$undev.seed1+delph$undev.seed+delph$total.seeds)) #adding proportion of developed seeds
delph$deviation<-abs(delph$relative.position) #getting deviation from the peak
delph$early.late<-factor(NA, levels = c("early","late")) #creating early/late variables based on relative position
delph$early.late[delph$relative.position<0]<-"early"
delph$early.late[delph$relative.position>0]<-"late"
delph<-delph[!is.na(delph$early.late),]
The third dataset contains Potentilla pulcherrima data. Potentilla was set up in all but one of our sites. Potentilla data only includes total seed counts because we couldn’t count the undeveloped seeds. However, we calculated the deviation and early/late values like the previous species.
pot = read.csv("Potentilla_final2.csv") # read in Potentilla data
pot<-pot[c(-119,-223),] #removing one row with NA in treatment column
pot<-pot[!is.na(pot$relative.position),] #removing NA values in relative position
pot<-pot[!is.na(pot$total.seeds),] #removing NA values in total seeds column
pot$deviation<-abs(pot$relative.position) #getting deviation from the peak
pot$early.late<-factor(NA, levels = c("early","late")) #creating early/late variables based on relative position
pot$early.late[pot$relative.position<0]<-"early"
pot$early.late[pot$relative.position>0]<-"late"
pot<-pot[!is.na(pot$early.late),]
Because many of the Potentilla individuals were still in bloom when we finished our field season, we had to calculate a midpoint and relative position based on those individuals that had senesced. A key factor that determines duration of blooming is the number of flowers on the individual. The data imported includes those relative position estimates for the individuals that didn’t senesce before we finished our field season. For more information on how those numbers were calculated, see Data_Cleaning.Rmd.
The community flower count data is essential to the number of conspecifics effect. Each of the species has to be analyzed separately.
flower.counts=read.csv("flower_counts.csv") #read in flower count data
We calculated the average number of Mertensia flowers in each site and plot in each week. This number was then merged with the Mertensia individuals to add the number of conspecifics variable.
mert.flower.counts<-flower.counts[(flower.counts$plant=="Mertensia fusiformis"),] #limit flower counts to Mertensia data
mert.counts.by.site<-aggregate(x=mert.flower.counts$total_flowers,by=list(mert.flower.counts$date,mert.flower.counts$site,mert.flower.counts$plot),FUN="mean") #calculate mean flower counts by week and site
colnames(mert.counts.by.site)<-c("date","site","plot.treat","number.conspecifics")
mert.counts.by.site$site<-as.character(mert.counts.by.site$site) #changing class to adjust names
mert.counts.by.site$plot.treat<-as.character(mert.counts.by.site$plot.treat)
mert.counts.by.site$site[mert.counts.by.site$site=="Avery Picnic"]<-"AveryPicnic" #fixing names
mert.counts.by.site$site[mert.counts.by.site$site=="Stupid Falls"]<-"StupidFalls"
mert.counts.by.site$site[mert.counts.by.site$site=="Wash 3C"]<-"WG3C"
mert.counts.by.site$plot.treat[!(mert.counts.by.site$plot.treat=="Kaysee")]
mert.counts.by.site$plot.treat[mert.counts.by.site$plot.treat=="Control"]<-"control"
mert.counts.by.site$plot.treat[mert.counts.by.site$plot.treat=="Manipulated"]<-"manip"
mert$week.estimate<-strftime(mert$midpoint, format = "%V") #calculating week numbers in preparation for the merge
mert.counts.by.site$week.estimate<-strftime(mert.counts.by.site$date, format = "%V")
mert<-merge(mert,mert.counts.by.site, by.x = c("site","plot.treat","week.estimate"), by.y = c("site","plot.treat","week.estimate")) #merging by site, plot treatment, and week estimate
The same was repeated for Delphinium.
delph.flower.counts<-flower.counts[(flower.counts$plant=="Delphinium nuttallianum"),] #limit flower counts to Delphinium data
delph.counts.by.site<-aggregate(x=delph.flower.counts$total_flowers,by=list(delph.flower.counts$date,delph.flower.counts$site,delph.flower.counts$plot),FUN="mean") #calculate mean flower counts by week and site
colnames(delph.counts.by.site)<-c("date","site","plot.treat","number.conspecifics")
delph.counts.by.site$site<-as.character(delph.counts.by.site$site) #changing class to adjust names
delph.counts.by.site$plot.treat<-as.character(delph.counts.by.site$plot.treat)
delph.counts.by.site$site[delph.counts.by.site$site=="Rustlers Gulch"]<-"RustlersGulch" #fixing names
delph.counts.by.site$site[delph.counts.by.site$site=="Wash 3C"]<-"WG3C"
#delph.counts.by.site$plot.treat[!(delph.counts.by.site$plot.treat=="Kaysee")]
delph.counts.by.site$plot.treat[delph.counts.by.site$plot.treat=="Control"]<-"control"
delph.counts.by.site$plot.treat[delph.counts.by.site$plot.treat=="Manipulated"]<-"manip"
delph$week.estimate<-strftime(delph$midpoint, format = "%V") #calculating week numbers in preparation for the merge
delph.counts.by.site$week.estimate<-strftime(delph.counts.by.site$date, format = "%V")
delph<-merge(delph,delph.counts.by.site, by.x = c("site","plot.treat","week.estimate"), by.y = c("site","plot.treat","week.estimate")) #merging by site, plot treatment, and week estimate
The same was done for Potentilla.
pot.flower.counts<-flower.counts[(flower.counts$plant=="Potentilla pulcherrima"),] #limit flower counts to Potentilla data
pot.counts.by.site<-aggregate(x=pot.flower.counts$total_flowers,by=list(pot.flower.counts$date,pot.flower.counts$site,pot.flower.counts$plot),FUN="mean") #calculate mean flower counts by week and site
colnames(pot.counts.by.site)<-c("date","site","plot.treat","number.conspecifics")
pot.counts.by.site$site<-as.character(pot.counts.by.site$site) #changing class to adjust names
pot.counts.by.site$plot.treat<-as.character(pot.counts.by.site$plot.treat)
pot.counts.by.site$site[pot.counts.by.site$site=="Rustlers Gulch"]<-"RustlersGulch" #fixing names
pot.counts.by.site$site[pot.counts.by.site$site=="Wash 3C"]<-"WG3C"
pot.counts.by.site$site[pot.counts.by.site$site=="Bellview Bench"]<-"BellviewBench"
pot.counts.by.site$site[pot.counts.by.site$site=="Avery Picnic"]<-"AveryPicnic"
pot.counts.by.site$site[pot.counts.by.site$site=="Stupid Falls"]<-"StupidFalls"
#pot.counts.by.site$plot.treat[!(pot.counts.by.site$plot.treat=="Kaysee")]
pot.counts.by.site$plot.treat[pot.counts.by.site$plot.treat=="Control"]<-"control"
pot.counts.by.site$plot.treat[pot.counts.by.site$plot.treat=="Manipulated"]<-"manip"
pot$week.estimate<-strftime(pot$midpoint, format = "%V") #calculating week numbers in preparation for the merge
pot.counts.by.site$week.estimate<-strftime(pot.counts.by.site$date, format = "%V")
pot<-merge(pot,pot.counts.by.site, by.x = c("site","plot.treat","week.estimate"), by.y = c("site","plot.treat","week.estimate")) #merging by site, plot treatment, and week estimate
Soil moisture is a covariate that may impact seed production. In the field, we measured soil moisture in designated areas of the plot once per week, for 9 weeks. To understand which variables representing change in soil moisture are most influential for seed production, we ran a generalized linear mixed model with all of the soil moisture variables. Site, plot treatment, and species are random effects, while the soil moisture variables (mean moisture, rate of change, effective minimum or value at week 7, final moisture reading, and range) are fixed effects. Once we had this model, we ran the dredge function to find the most appropriate combination of variables for our larger model.
We are including all of the individuals of the three species and using species as a random effect.
condensed.mert<-mert[,c(-4,-20:-23,-30)] #removing unnecessary columns
condensed.delph<-delph[,c(-4,-20:-28,-30,-36)]
condensed.pot<-pot[,c(-4,-20:-28,-30,-33:-37)]
all.seeds<-rbind(condensed.mert,condensed.delph,condensed.pot) #combining all of the data sets
all.seed.nbinom<-fitdist(all.seeds$total.seeds, "nbinom") #fitting Mertensia data to negative binomial distribution using fitdistplus
plot(all.seed.nbinom) #plotting to see the fit
The seeds fit a negative binomial distribution, so we used the glmmADMB package.
soil.mod<-glmmadmb(total.seeds ~ mean + rate + effect.min + end + range + (1|site/plot.treat) + (1|species), family = "nbinom2", data = all.seeds) #model for soil moisture variables with all seeds
summary(soil.mod)
##
## Call:
## glmmadmb(formula = total.seeds ~ mean + rate + effect.min + end +
## range + (1 | site/plot.treat) + (1 | species), data = all.seeds,
## family = "nbinom2")
##
## AIC: 2528.8
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.60748 0.54742 6.59 4.4e-11 ***
## mean 0.03149 0.06379 0.49 0.62
## rate -0.00138 0.11428 -0.01 0.99
## effect.min -0.01341 0.07220 -0.19 0.85
## end 0.02198 0.02936 0.75 0.45
## range -0.00506 0.06036 -0.08 0.93
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Number of observations: total=244, site=7, site:plot.treat=14, species=3
## Random effect variance(s):
## Group=site
## Variance StdDev
## (Intercept) 0.06849 0.2617
## Group=site:plot.treat
## Variance StdDev
## (Intercept) 0.01709 0.1307
## Group=species
## Variance StdDev
## (Intercept) 0.348 0.5899
##
## Negative binomial dispersion parameter: 1.3756 (std. err.: 0.13252)
##
## Log-likelihood: -1254.41
#dredge_result<-dredge(soil.mod) #using dredge funciton for model selection
#subset(dredge_result, delta<4)
The null model was the best for these data. None of the combinations of soil moisture variables were selected for predicting the data. As a result, we won’t include soil moisture as a fixed effect in our final model.
Generalized linear mixed effects models were appropriate for this analysis because the data contain sources of non-independence. Individual plants were located in the same site as other individuals and were likely genetically similar. Therefore, we considered site a random effect.
The response variable is total seeds, which is discrete and non-zero. The interaction between deviation and the early/late factor was a fixed effect, as well as the interaction between plot treatment and conspecific density. We would have included soil moisture as a covariate and fixed effect in our model, but soil moisture was not important for seed production. Each species is analyzed separately.
We started by limiting the individuals to the open treatment (excluding the hand-pollinated treatment) and by checking the distribution of the total seed counts.
mert.open<-mert[(mert$treat=="open"),] #removed hand pollination treatment
mert.nbinom<-fitdist(mert.open$dev.seed, "nbinom") #fitting Mertensia data to negative binomial distribution using fitdistplus
plot(mert.nbinom) #plotting to see the fit
The Mertensia seed data fits a negative binomial distribution. The glmmTMB package is a good package for modeling data with a negative binomial. The glmmTMB package is also suitable for data that could be overdispersed or zero-inflated.
mert.glmmtmb<-glmmTMB(dev.seed ~ deviation * early.late + plot.treat * number.conspecifics + (1|site), family = "nbinom2", data = mert.open) #putting count data into glmmTMB for DHARMa package
summary(mert.glmmtmb) #summary of glmmTMB model
## Family: nbinom2 ( log )
## Formula:
## dev.seed ~ deviation * early.late + plot.treat * number.conspecifics +
## (1 | site)
## Data: mert.open
##
## AIC BIC logLik deviance df.resid
## 403.8 420.0 -192.9 385.8 36
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## site (Intercept) 0.1931 0.4394
## Number of obs: 45, groups: site, 4
##
## Overdispersion parameter for nbinom2 family (): 1.33
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.763682 0.673116 5.591 2.25e-08
## deviation 0.006699 0.116952 0.057 0.954
## early.latelate -0.008385 0.635532 -0.013 0.989
## plot.treatmanip -0.476894 0.844993 -0.564 0.572
## number.conspecifics -0.003599 0.005653 -0.637 0.524
## deviation:early.latelate -0.107746 0.213206 -0.505 0.613
## plot.treatmanip:number.conspecifics 0.002852 0.018787 0.152 0.879
##
## (Intercept) ***
## deviation
## early.latelate
## plot.treatmanip
## number.conspecifics
## deviation:early.latelate
## plot.treatmanip:number.conspecifics
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
We did not detect an effect of relative blooming time, conspecific density, or plot treatment on the total number of seeds in Mertensia individuals.
We then checked for overdispersion and zero-inflation in the data using the DHARMa package. The overdispersion and zero-inflation tests work with the glmmTMB package.
mert.counts.simulation<-simulateResiduals(fittedModel = mert.glmmtmb) #creating simulation for Mertensia mixed effects model with DHARMa package
plot(mert.counts.simulation) #plotting simulation
testDispersion(mert.counts.simulation) #checking for overdispersion
##
## DHARMa nonparametric dispersion test via sd of residuals fitted
## vs. simulated
##
## data: simulationOutput
## ratioObsSim = 0.78755, p-value = 0.696
## alternative hypothesis: two.sided
testZeroInflation(mert.counts.simulation) #checking for zero inflation
##
## DHARMa zero-inflation test via comparison to expected zeros with
## simulation under H0 = fitted model
##
## data: simulationOutput
## ratioObsSim = 3.8462, p-value = 0.048
## alternative hypothesis: two.sided
The Mertensia count data is not overdispersed, but it is slightly zero-inflated. To address this, we adjusted our glmmtmb model to include zero-inflation.
mert.glmmtmb<-glmmTMB(dev.seed ~ deviation * early.late + plot.treat * number.conspecifics + (1|site), ziformula=~1, family = "nbinom2", data = mert.open) #putting count data into glmmTMB for DHARMa package
summary(mert.glmmtmb) #summary of glmmTMB model
## Family: nbinom2 ( log )
## Formula:
## dev.seed ~ deviation * early.late + plot.treat * number.conspecifics +
## (1 | site)
## Zero inflation: ~1
## Data: mert.open
##
## AIC BIC logLik deviance df.resid
## 396.2 414.3 -188.1 376.2 35
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## site (Intercept) 0.1542 0.3927
## Number of obs: 45, groups: site, 4
##
## Overdispersion parameter for nbinom2 family (): 2.53
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.913352 0.545809 7.170 7.51e-13
## deviation 0.058509 0.093291 0.627 0.531
## early.latelate 0.224088 0.491339 0.456 0.648
## plot.treatmanip -0.788027 0.630113 -1.251 0.211
## number.conspecifics -0.005932 0.004519 -1.313 0.189
## deviation:early.latelate -0.206705 0.175165 -1.180 0.238
## plot.treatmanip:number.conspecifics 0.006472 0.014241 0.454 0.649
##
## (Intercept) ***
## deviation
## early.latelate
## plot.treatmanip
## number.conspecifics
## deviation:early.latelate
## plot.treatmanip:number.conspecifics
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Zero-inflation model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.3734 0.5477 -4.333 1.47e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
We then checked this new model for overdispersion and zero-inflation.
mert.counts.simulation<-simulateResiduals(fittedModel = mert.glmmtmb) #creating simulation for Mertensia mixed effects model with DHARMa package
plot(mert.counts.simulation) #plotting simulation
testDispersion(mert.counts.simulation) #checking for overdispersion
##
## DHARMa nonparametric dispersion test via sd of residuals fitted
## vs. simulated
##
## data: simulationOutput
## ratioObsSim = 0.9235, p-value = 0.944
## alternative hypothesis: two.sided
testZeroInflation(mert.counts.simulation) #checking for zero inflation
##
## DHARMa zero-inflation test via comparison to expected zeros with
## simulation under H0 = fitted model
##
## data: simulationOutput
## ratioObsSim = 1.0638, p-value = 1
## alternative hypothesis: two.sided
Zero-inflation is accounted for in the new model, and the model for Mertensia count data is no longer zero-inflated.
To test the pollen limitation individuals, we created a separate fixed effects model. This model has site and plot treatment as random effects and pollen limitation treatment as a fixed effect. The response variable is still total number of developed seeds in Mertensia individuals.
mert.treat.glmmtmb<-glmmTMB(dev.seed ~ treat + (1|site/plot.treat), family = "nbinom2", data = mert) #Mertensia model for negative binomial data with glmmTMB package
summary(mert.treat.glmmtmb) #summary of model output
## Family: nbinom2 ( log )
## Formula: dev.seed ~ treat + (1 | site/plot.treat)
## Data: mert
##
## AIC BIC logLik deviance df.resid
## 808.1 820.8 -399.1 798.1 88
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## plot.treat:site (Intercept) 0.04782 0.2187
## site (Intercept) 0.03407 0.1846
## Number of obs: 93, groups: plot.treat:site, 8; site, 4
##
## Overdispersion parameter for nbinom2 family (): 1.81
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.28199 0.17008 19.297 <2e-16 ***
## treatopen-hand 0.08614 0.16436 0.524 0.6
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
We did not detect an effect of pollen limitation treatment on Mertensia total developed seeds.
We had to test the model assumptions of our pollen limitation model as well. After converting our model to an glmmTMB model, we tested for overdispersion and zero-inflation with the DHARMa package.
mert.counts.treat.simulation<-simulateResiduals(fittedModel = mert.treat.glmmtmb) #creating simulation for Mertensia mixed effects model with DHARMa package
plot(mert.counts.treat.simulation) #plotting simulation
testDispersion(mert.counts.treat.simulation) #checking for overdispersion
##
## DHARMa nonparametric dispersion test via sd of residuals fitted
## vs. simulated
##
## data: simulationOutput
## ratioObsSim = 0.86177, p-value = 0.6
## alternative hypothesis: two.sided
testZeroInflation(mert.counts.treat.simulation) #checking for zero inflation
##
## DHARMa zero-inflation test via comparison to expected zeros with
## simulation under H0 = fitted model
##
## data: simulationOutput
## ratioObsSim = 8.5616, p-value < 2.2e-16
## alternative hypothesis: two.sided
The data in the pollen limitation model for Mertensia is not overdispersed, but it is zero-inflated. We then adjusted our model to include zero-inflation and ran the overdispersion and zero-inflation tests again.
mert.treat.glmmtmb<-glmmTMB(dev.seed ~ treat + (1|site/plot.treat), ziformula=~1, family = "nbinom2", data = mert) #Mertensia model for negative binomial data with glmmTMB package
summary(mert.treat.glmmtmb) #summary of model output
## Family: nbinom2 ( log )
## Formula: dev.seed ~ treat + (1 | site/plot.treat)
## Zero inflation: ~1
## Data: mert
##
## AIC BIC logLik deviance df.resid
## 791.4 806.6 -389.7 779.4 87
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## plot.treat:site (Intercept) 0.08162 0.2857
## site (Intercept) 0.01479 0.1216
## Number of obs: 93, groups: plot.treat:site, 8; site, 4
##
## Overdispersion parameter for nbinom2 family (): 3.01
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.371413 0.155514 21.679 <2e-16 ***
## treatopen-hand 0.006098 0.133790 0.046 0.964
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Zero-inflation model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.8927 0.4709 -6.143 8.12e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
mert.counts.treat.simulation<-simulateResiduals(fittedModel = mert.treat.glmmtmb) #creating simulation for Mertensia mixed effects model with DHARMa package
plot(mert.counts.treat.simulation) #plotting simulation
testDispersion(mert.counts.treat.simulation) #checking for overdispersion
##
## DHARMa nonparametric dispersion test via sd of residuals fitted
## vs. simulated
##
## data: simulationOutput
## ratioObsSim = 0.96976, p-value = 0.984
## alternative hypothesis: two.sided
testZeroInflation(mert.counts.treat.simulation) #checking for zero inflation
##
## DHARMa zero-inflation test via comparison to expected zeros with
## simulation under H0 = fitted model
##
## data: simulationOutput
## ratioObsSim = 1.0187, p-value = 1
## alternative hypothesis: two.sided
The data are no longer zero-inflated, and we still did not detect an effect of pollen limitation on the Mertensia seed counts.
Below is the plot of seed set vs. relative position of blooming in the population for Mertensia individuals. Plot treatment is indicated by individual color.
ggplot(mert.open, aes(x=mert.open$relative.position, y=mert.open$dev.seed, group=mert.open$plot.treat)) +
labs(y="Total Developed Seeds",x="Days Relative to Population Peak Bloom", title="Effect of Mertensia Blooming Time on Total Developed Seeds") +
geom_point(aes(color=plot.treat),size=3, alpha = 0.8) +
scale_color_brewer(palette="Dark2") + labs(color="Plot Treatment") +
scale_color_manual(labels= c("control","accelerated"), values = c("control"="darkred","manip"="darkorange")) +
geom_smooth()
We then plotted the interaction between deviation and early/late instead of relative position in order to fit a linear model.
ggplot(mert.open, aes(x=mert.open$deviation, y=mert.open$dev.seed, group= mert.open$early.late)) +
labs(y="Total Developed Seeds",x="Days Relative to Population Peak Bloom", title="Effect of Mertensia Deviation from Peak on Total Developed Seeds") + theme_classic() +
theme_classic() +
geom_point(size=3, alpha = 0.8, aes(color=early.late)) +
geom_smooth(method="glm",aes(color=early.late)) +
scale_color_brewer(palette="Dark2") +
labs(color="Before or After Peak") +
scale_color_manual(labels= c("before peak","after peak"), values = c("early"="darkred","late"="darkorange"))
Then we plotted the effect of conspecific density and plot treatment on total developed seeds.
ggplot(mert.open, aes(x=mert.open$number.conspecifics, y=mert.open$dev.seed, group= mert.open$plot.treat)) +
labs(y="Total Developed Seeds",x="Conspecific Density", title="Effect of Mertensia Conspecific Density on Total Developed Seeds") +
theme_classic() +
geom_point(size=3, alpha = 0.8, aes(color=plot.treat)) +
geom_smooth(method="glm",aes(color=plot.treat)) +
scale_color_brewer(palette="Dark2") +
labs(color="Plot Treatment") +
scale_color_manual(labels= c("control","accelerated snowmelt"), values = c("control"="darkgreen","manip"="blue"))
For Delphinium, we again limited the individuals to open treatment individuals.
delph.open<-delph[(delph$treat=="open"),] #removed hand pollination treatment
delph.nbinom<-fitdist(delph.open$total.seeds, "nbinom") #fitting negative binomial distribution using fitdistplus package
plot(delph.nbinom) #plotting distribution fit
The Delphinium data fits a negative binomial distribution. We used the glmmTMB package again.
delph.glmmtmb<-glmmTMB(total.seeds ~ deviation * early.late + plot.treat * number.conspecifics + (1|site), family = "nbinom2", data = delph.open) #Delphinium model for negative binomial data with glmmTMB package
#removed treat fixed effect (only open)
summary(delph.glmmtmb) #summary of model output
## Family: nbinom2 ( log )
## Formula:
## total.seeds ~ deviation * early.late + plot.treat * number.conspecifics +
## (1 | site)
## Data: delph.open
##
## AIC BIC logLik deviance df.resid
## 410.3 425.7 -196.1 392.3 32
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## site (Intercept) 2.331e-09 4.828e-05
## Number of obs: 41, groups: site, 4
##
## Overdispersion parameter for nbinom2 family (): 1.19
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.412129 0.626348 5.448 5.1e-08
## deviation -0.020961 0.128303 -0.163 0.870
## early.latelate -0.060861 0.862949 -0.071 0.944
## plot.treatmanip 1.304889 1.005007 1.298 0.194
## number.conspecifics 0.008634 0.010705 0.807 0.420
## deviation:early.latelate 0.196086 0.211178 0.929 0.353
## plot.treatmanip:number.conspecifics -0.023397 0.015296 -1.530 0.126
##
## (Intercept) ***
## deviation
## early.latelate
## plot.treatmanip
## number.conspecifics
## deviation:early.latelate
## plot.treatmanip:number.conspecifics
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
We did not detect an effect of relative blooming time, plot treatment, or conspecific density on the total developed seeds for Delphinium individuals.
Next, we tested the model assumptions as we did with Mertensia seed count data. We checked for overdispersion and zero-inflation.
delph.counts.simulation<-simulateResiduals(fittedModel = delph.glmmtmb) #creating simulation for Delphinium mixed effects model with DHARMa package
plot(delph.counts.simulation) #plotting simulation
testDispersion(delph.counts.simulation) #checking for overdispersion
##
## DHARMa nonparametric dispersion test via sd of residuals fitted
## vs. simulated
##
## data: simulationOutput
## ratioObsSim = 0.90053, p-value = 0.752
## alternative hypothesis: two.sided
testZeroInflation(delph.counts.simulation) #checking for zero inflation
##
## DHARMa zero-inflation test via comparison to expected zeros with
## simulation under H0 = fitted model
##
## data: simulationOutput
## ratioObsSim = 3.4722, p-value = 0.232
## alternative hypothesis: two.sided
The model for the Delphinium count data is not overdispersed or zero-inflated.
Again, we tested the pollen limitation in a separate mixed effects model.
delph.treat.glmmtmb<-glmmTMB(total.seeds ~ treat + (1|site/plot.treat), family = "nbinom2", data = delph) #Mertensia model for negative binomial data with glmmTMB package
summary(delph.treat.glmmtmb) #summary of model output
## Family: nbinom2 ( log )
## Formula: total.seeds ~ treat + (1 | site/plot.treat)
## Data: delph
##
## AIC BIC logLik deviance df.resid
## 829.6 841.7 -409.8 819.6 79
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## plot.treat:site (Intercept) 0.005361 0.07322
## site (Intercept) 0.034797 0.18654
## Number of obs: 84, groups: plot.treat:site, 7; site, 4
##
## Overdispersion parameter for nbinom2 family (): 1.16
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.83705 0.18386 20.87 <2e-16 ***
## treatopen-hand 0.08871 0.21142 0.42 0.675
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
We did not detect an effect of pollen limitation on the total developed seeds of Delphinium individuals.
We again checked for overdispersion and zero-inflation in the pollen limitation data.
delph.counts.treat.simulation<-simulateResiduals(fittedModel = delph.treat.glmmtmb) #creating simulation for Delphinium mixed effects model with DHARMa package
plot(delph.counts.treat.simulation) #plotting simulation
testDispersion(delph.counts.treat.simulation) #checking for overdispersion
##
## DHARMa nonparametric dispersion test via sd of residuals fitted
## vs. simulated
##
## data: simulationOutput
## ratioObsSim = 0.83579, p-value = 0.328
## alternative hypothesis: two.sided
testZeroInflation(delph.counts.treat.simulation) #checking for zero inflation
##
## DHARMa zero-inflation test via comparison to expected zeros with
## simulation under H0 = fitted model
##
## data: simulationOutput
## ratioObsSim = 3.413, p-value = 0.072
## alternative hypothesis: two.sided
The Delphinum pollen limitation model is not overdispersed. The data are slightly zero-inflated. Because the data were zero-inflated, we adjusted our model to include the zero-inflation formula and re-tested the overdispersion and zero-inflation.
delph.treat.glmmtmb<-glmmTMB(total.seeds ~ treat + (1|site/plot.treat), ziformula=~1, family = "nbinom2", data = delph) #Mertensia model for negative binomial data with glmmTMB package
summary(delph.treat.glmmtmb) #summary of model output
## Family: nbinom2 ( log )
## Formula: total.seeds ~ treat + (1 | site/plot.treat)
## Zero inflation: ~1
## Data: delph
##
## AIC BIC logLik deviance df.resid
## 824.1 838.7 -406.0 812.1 78
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## plot.treat:site (Intercept) 0.01460 0.1208
## site (Intercept) 0.03166 0.1779
## Number of obs: 84, groups: plot.treat:site, 7; site, 4
##
## Overdispersion parameter for nbinom2 family (): 1.6
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.87877 0.17023 22.786 <2e-16 ***
## treatopen-hand 0.09481 0.18614 0.509 0.611
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Zero-inflation model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.0968 0.5684 -5.448 5.09e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
delph.counts.treat.simulation<-simulateResiduals(fittedModel = delph.treat.glmmtmb) #creating simulation for Delphinium mixed effects model with DHARMa package
plot(delph.counts.treat.simulation) #plotting simulation
testDispersion(delph.counts.treat.simulation) #checking for overdispersion
##
## DHARMa nonparametric dispersion test via sd of residuals fitted
## vs. simulated
##
## data: simulationOutput
## ratioObsSim = 0.91298, p-value = 0.592
## alternative hypothesis: two.sided
testZeroInflation(delph.counts.treat.simulation) #checking for zero inflation
##
## DHARMa zero-inflation test via comparison to expected zeros with
## simulation under H0 = fitted model
##
## data: simulationOutput
## ratioObsSim = 1.0331, p-value = 1
## alternative hypothesis: two.sided
The new model is not overdispersed or zero-inflated. We still did not see an effect of pollen limitation on the Delphinium count data.
Below are the plots for the Delphinium individuals.
ggplot(delph.open, aes(x=delph.open$relative.position, y=delph.open$total.seeds, group=plot.treat)) +
labs(title="Effect of Delphinium Blooming Time on Total Developed Seeds", y="Total Developed Seeds",x="Days Relative to Population Peak Bloom") +
geom_point(aes(color=plot.treat),size=3, alpha = 0.8) +
scale_color_brewer(palette="Dark2") + labs(color="Plot Treatment") +
scale_color_manual(labels= c("control","accelerated"), values = c("control"="darkred","manip"="darkorange")) +
geom_smooth()
ggplot(delph.open, aes(x=delph.open$deviation, y=delph.open$total.seeds, group= delph.open$early.late)) +
labs(y="Total Developed Seeds",x="Days Relative to Population Peak Bloom", title="Effect of Delphinium Deviation from Peak on Total Developed Seeds") +
theme_classic() +
geom_point(size=3, alpha = 0.8, aes(color=early.late)) +
geom_smooth(method="glm",aes(color=early.late)) +
scale_color_brewer(palette="Dark2") +
labs(color="Before or After Peak") +
scale_color_manual(labels= c("before peak","after peak"), values = c("early"="darkred","late"="darkorange"))
ggplot(delph.open, aes(x=delph.open$number.conspecifics, y=delph.open$total.seeds, group= delph.open$plot.treat)) +
labs(y="Total Developed Seeds",x="Conspecific Density", title="Effect of Delphinium Conspecific Density on Total Developed Seeds") +
theme_classic() +
geom_point(size=3, alpha = 0.8, aes(color=plot.treat)) +
geom_smooth(method="glm",aes(color=plot.treat)) +
scale_color_brewer(palette="Dark2") +
labs(color="Plot Treatment") +
scale_color_manual(labels= c("control","accelerated snowmelt"), values = c("control"="darkgreen","manip"="blue"))
We began by limiting the data to the open treatment Potentilla individuals.
pot.open<-pot[(pot$treat=="open"),] #removed hand pollination treatment
pot.nbinom<-fitdist(pot.open$total.seeds, "nbinom") #fitting negative binomial distribution using fitdistplus package
plot(pot.nbinom) #plotting distribution fit
The Potentilla seed data fits a negative binomial distribution. We used the glmmTMB package again.
pot.glmmtmb<-glmmTMB(total.seeds ~ deviation * early.late + plot.treat * number.conspecifics + plot.treat + (1|site), family = "nbinom2", data = pot.open) #Potentilla model for negative binomial data with glmmTMB package
#removed treat fixed effect (only open)
summary(pot.glmmtmb) #summary of model output
## Family: nbinom2 ( log )
## Formula:
## total.seeds ~ deviation * early.late + plot.treat * number.conspecifics +
## plot.treat + (1 | site)
## Data: pot.open
##
## AIC BIC logLik deviance df.resid
## 443.2 457.4 -212.6 425.2 27
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## site (Intercept) 1.334e-09 3.653e-05
## Number of obs: 36, groups: site, 7
##
## Overdispersion parameter for nbinom2 family (): 1.8
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.521033 0.518907 8.713 <2e-16
## deviation 0.024797 0.023476 1.056 0.291
## early.latelate 0.147618 0.504942 0.292 0.770
## plot.treatmanip 0.410126 0.466347 0.879 0.379
## number.conspecifics 0.007169 0.009122 0.786 0.432
## deviation:early.latelate -0.060803 0.041215 -1.475 0.140
## plot.treatmanip:number.conspecifics -0.006156 0.009809 -0.628 0.530
##
## (Intercept) ***
## deviation
## early.latelate
## plot.treatmanip
## number.conspecifics
## deviation:early.latelate
## plot.treatmanip:number.conspecifics
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
We did not detect an effect of relative blooming time, plot treatment, or conspecific density on the total developed seeds of Potentilla individuals.
Below we checked overdispersion and zero-inflation.
pot.counts.simulation<-simulateResiduals(fittedModel = pot.glmmtmb) #creating simulation for Potentilla mixed effects model with DHARMa package
plot(pot.counts.simulation) #plotting simulation
testDispersion(pot.counts.simulation) #checking for overdispersion
##
## DHARMa nonparametric dispersion test via sd of residuals fitted
## vs. simulated
##
## data: simulationOutput
## ratioObsSim = 0.77311, p-value = 0.344
## alternative hypothesis: two.sided
testZeroInflation(pot.counts.simulation) #checking for zero inflation
##
## DHARMa zero-inflation test via comparison to expected zeros with
## simulation under H0 = fitted model
##
## data: simulationOutput
## ratioObsSim = 62.5, p-value = 0.032
## alternative hypothesis: two.sided
The Potentilla data are not overdispersed, but they are zero-inflated. To fix this, we had to include zero inflation in our model and again check for zero-inflation.
pot.glmmtmb<-glmmTMB(total.seeds ~ deviation * early.late + plot.treat * number.conspecifics + plot.treat + (1|site), ziformula=~1, family = "nbinom2", data = pot.open) #new Potentilla model for negative binomial data with glmmTMB package
summary(pot.glmmtmb) #summary of model output
## Family: nbinom2 ( log )
## Formula:
## total.seeds ~ deviation * early.late + plot.treat * number.conspecifics +
## plot.treat + (1 | site)
## Zero inflation: ~1
## Data: pot.open
##
## AIC BIC logLik deviance df.resid
## 438.0 453.8 -209.0 418.0 26
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## site (Intercept) 1.017e-09 3.188e-05
## Number of obs: 36, groups: site, 7
##
## Overdispersion parameter for nbinom2 family (): 2.52
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.691957 0.439423 10.678 <2e-16
## deviation 0.025483 0.019872 1.282 0.1997
## early.latelate 0.182504 0.423939 0.430 0.6668
## plot.treatmanip 0.223059 0.403054 0.553 0.5800
## number.conspecifics 0.003776 0.007599 0.497 0.6192
## deviation:early.latelate -0.062739 0.034846 -1.800 0.0718
## plot.treatmanip:number.conspecifics -0.002751 0.008180 -0.336 0.7367
##
## (Intercept) ***
## deviation
## early.latelate
## plot.treatmanip
## number.conspecifics
## deviation:early.latelate .
## plot.treatmanip:number.conspecifics
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Zero-inflation model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.558 1.017 -3.499 0.000467 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
When we incorporated zero-inflation into the model, we found a marginally significant trend in the interaction between deviation from the population peak and blooming before or after the population peak. Potentilla individuals that bloomed before the peak had a marginally significant increase in seed set.
However, we had to test for overdispersion and zero-inflation again.
pot.counts.simulation<-simulateResiduals(fittedModel = pot.glmmtmb) #creating simulation for Potentilla mixed effects model with DHARMa package
plot(pot.counts.simulation) #plotting simulation
testDispersion(pot.counts.simulation) #checking for overdispersion
##
## DHARMa nonparametric dispersion test via sd of residuals fitted
## vs. simulated
##
## data: simulationOutput
## ratioObsSim = 0.87462, p-value = 0.576
## alternative hypothesis: two.sided
testZeroInflation(pot.counts.simulation) #checking for zero inflation
##
## DHARMa zero-inflation test via comparison to expected zeros with
## simulation under H0 = fitted model
##
## data: simulationOutput
## ratioObsSim = 0.95785, p-value = 1
## alternative hypothesis: two.sided
The data are no longer overdispersed or zero-inflated for the Potentilla count data.
Below is the mixed effects model for the pollen limitation treatments.
pot.treat.glmmtmb<-glmmTMB(total.seeds ~ treat + (1|site/plot.treat), family = "nbinom2", data = pot) #Potentilla model for negative binomial data with glmmadmb package
summary(pot.treat.glmmtmb) #summary of model output
## Family: nbinom2 ( log )
## Formula: total.seeds ~ treat + (1 | site/plot.treat)
## Data: pot
##
## AIC BIC logLik deviance df.resid
## 809.9 820.9 -400.0 799.9 62
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## plot.treat:site (Intercept) 0.15889 0.3986
## site (Intercept) 0.01106 0.1051
## Number of obs: 67, groups: plot.treat:site, 11; site, 7
##
## Overdispersion parameter for nbinom2 family (): 1.42
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.9853 0.2401 20.766 <2e-16 ***
## treatopen-hand -0.1552 0.2159 -0.719 0.472
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
We did not detect an effect of the pollen limitation treatment on the total number of developed seeds for Potentilla individuals.
Below is the test for overdispersion and zero-inflation for Potentilla pollen limitation data.
pot.counts.treat.simulation<-simulateResiduals(fittedModel = pot.treat.glmmtmb) #creating simulation for Potentilla mixed effects model with DHARMa package
plot(pot.counts.treat.simulation) #plotting simulation
testDispersion(pot.counts.treat.simulation) #checking for overdispersion
##
## DHARMa nonparametric dispersion test via sd of residuals fitted
## vs. simulated
##
## data: simulationOutput
## ratioObsSim = 0.79881, p-value = 0.568
## alternative hypothesis: two.sided
testZeroInflation(pot.counts.treat.simulation) #checking for zero inflation
##
## DHARMa zero-inflation test via comparison to expected zeros with
## simulation under H0 = fitted model
##
## data: simulationOutput
## ratioObsSim = 21.429, p-value = 0.008
## alternative hypothesis: two.sided
The Potentilla pollen limitation data were not overdispersed, but they are zero-inflated. We addressed the zero-inflation issue by again including the zero-inflation formula into our models.
pot.treat.glmmtmb<-glmmTMB(total.seeds ~ treat + (1|site/plot.treat), ziformula=~1, family = "nbinom2", data = pot) #Potentilla model for negative binomial data with glmmadmb package
summary(pot.treat.glmmtmb) #summary of model output
## Family: nbinom2 ( log )
## Formula: total.seeds ~ treat + (1 | site/plot.treat)
## Zero inflation: ~1
## Data: pot
##
## AIC BIC logLik deviance df.resid
## 795.8 809.0 -391.9 783.8 61
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## plot.treat:site (Intercept) 1.274e-01 0.3569566
## site (Intercept) 2.947e-08 0.0001717
## Number of obs: 67, groups: plot.treat:site, 11; site, 7
##
## Overdispersion parameter for nbinom2 family (): 2.24
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.97899 0.16868 29.517 <2e-16 ***
## treatopen-hand -0.09409 0.17544 -0.536 0.592
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Zero-inflation model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.0664 0.5943 -5.16 2.47e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
pot.counts.treat.simulation<-simulateResiduals(fittedModel = pot.treat.glmmtmb) #creating simulation for Potentilla mixed effects model with DHARMa package
plot(pot.counts.treat.simulation) #plotting simulation
testDispersion(pot.counts.treat.simulation) #checking for overdispersion
##
## DHARMa nonparametric dispersion test via sd of residuals fitted
## vs. simulated
##
## data: simulationOutput
## ratioObsSim = 0.98533, p-value = 0.96
## alternative hypothesis: two.sided
testZeroInflation(pot.counts.treat.simulation) #checking for zero inflation
##
## DHARMa zero-inflation test via comparison to expected zeros with
## simulation under H0 = fitted model
##
## data: simulationOutput
## ratioObsSim = 0.97656, p-value = 1
## alternative hypothesis: two.sided
The data are no longer zero-inflated, and we still did not detect an effect of pollen limitation in the Potentilla individuals.
Below are the plots for Potentilla individuals.
ggplot(pot.open, aes(x=pot.open$relative.position, y=pot.open$total.seeds, group=plot.treat)) +
labs(title="Effect of Potentilla Blooming Time on Total Developed Seeds", y="Total Developed Seeds",x="Days Relative to Population Peak Bloom") +
geom_point(aes(color=plot.treat),size=3, alpha = 0.8) +
scale_color_brewer(palette="Dark2") + labs(color="Plot Treatment") +
scale_color_manual(labels= c("control","accelerated"), values = c("control"="darkred","manip"="darkorange")) +
geom_smooth()
ggplot(pot.open, aes(x=pot.open$deviation, y=pot.open$total.seeds, group= pot.open$early.late)) +
labs(y="Total Developed Seeds",x="Days Relative to Population Peak Bloom",title="Effect of Potentilla Deviation from Peak on Total Developed Seeds") +
theme_classic() +
geom_point(size=3, alpha = 0.8, aes(color=early.late)) +
geom_smooth(method="glm",aes(color=early.late)) +
scale_color_brewer(palette="Dark2") +
labs(color="Before or After Peak") +
scale_color_manual(labels= c("before peak","after peak"), values = c("early"="darkred","late"="darkorange"))
ggplot(pot.open, aes(x=pot.open$number.conspecifics, y=pot.open$total.seeds, group= pot.open$plot.treat)) +
labs(y="Total Developed Seeds",x="Conspecific Density", title="Effect of Potentilla Conspecific Density on Total Developed Seeds") +
theme_classic() +
geom_point(size=3, alpha = 0.8, aes(color=plot.treat)) +
geom_smooth(method="glm",aes(color=plot.treat)) +
scale_color_brewer(palette="Dark2") +
labs(color="Plot Treatment") +
scale_color_manual(labels= c("control","accelerated snowmelt"), values = c("control"="darkgreen","manip"="blue"))
Only the Mertensia and Delphinium data included proportion of developed seeds to total seeds. When counting seeds for the Potentilla individuals, undeveloped seeds were difficult to distinguish from other elements of the carpel and were not included. Because the data are proportions and we are using the cbind function, we assume a binomial distribution.
First, we had to calculate undeveloped seeds to use the cbind function for our proportion of developed seeds.
mert.open$undev.seeds<-(mert.open$total.seeds-mert.open$dev.seed) #creating an undeveloped seed column for cbind
Below is the mixed effects model for the proportion of developed seeds. The individuals are still only limited to the open treatment.
Mert.prop.glmmtmb<-glmmTMB(cbind(dev.seed,undev.seeds) ~ deviation * early.late + plot.treat * number.conspecifics + (1|site), family = binomial, data = mert.open) #Mertensia model with proportion of developed seeds using the glmmTMB package
#removed treat fixed effect (only open in data set)
summary(Mert.prop.glmmtmb)
## Family: binomial ( logit )
## Formula:
## cbind(dev.seed, undev.seeds) ~ deviation * early.late + plot.treat *
## number.conspecifics + (1 | site)
## Data: mert.open
##
## AIC BIC logLik deviance df.resid
## 303.3 317.8 -143.7 287.3 37
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## site (Intercept) 0.1063 0.326
## Number of obs: 45, groups: site, 4
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.582092 0.319629 4.950 7.43e-07
## deviation 0.002412 0.049829 0.048 0.9614
## early.latelate -0.167077 0.253027 -0.660 0.5091
## plot.treatmanip -0.460888 0.280581 -1.643 0.1005
## number.conspecifics -0.004796 0.002672 -1.795 0.0727
## deviation:early.latelate -0.159243 0.096131 -1.657 0.0976
## plot.treatmanip:number.conspecifics -0.012437 0.008410 -1.479 0.1392
##
## (Intercept) ***
## deviation
## early.latelate
## plot.treatmanip
## number.conspecifics .
## deviation:early.latelate .
## plot.treatmanip:number.conspecifics
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
A marginally significant effect was detected in the interaction between deviation and early/late treatment and in the number of conspecifics main effect. As the number of conspecifics increased, seed set may have decreased.
Once we had our model, we were able to check for overdispersion and zero inflaction. We checked for overdispersion and zero inflation with the DHARMa package.
mert.prop.simulation<-simulateResiduals(fittedModel = Mert.prop.glmmtmb) #creating simulation for Mertensia mixed effects model with DHARMa package
plot(mert.prop.simulation) #plotting simulation
testDispersion(mert.prop.simulation) #checking for overdispersion
##
## DHARMa nonparametric dispersion test via sd of residuals fitted
## vs. simulated
##
## data: simulationOutput
## ratioObsSim = 1.0333, p-value = 0.64
## alternative hypothesis: two.sided
testZeroInflation(mert.prop.simulation)
##
## DHARMa zero-inflation test via comparison to expected zeros with
## simulation under H0 = fitted model
##
## data: simulationOutput
## ratioObsSim = 0.99305, p-value = 1
## alternative hypothesis: two.sided
The Mertensia proportion data were not overdispersed or zero-inflated.
Next, we created the pollen limitation model for the Mertensia developed seeds. The model includes site and plot treatment as random effects like the models above. Now the proportion of developed seeds is the response variable.
mert$undev.seeds<-(mert$total.seeds-mert$dev.seed) #creating an undeveloped seed column for cbind
Mert.prop.treat.glmmtmb<-glmmTMB(cbind(dev.seed,undev.seeds) ~ treat + (1|site/plot.treat), family = binomial, data = mert) #model with pollen lim treatment and proportion of developed seeds using the glmmTMB package
summary(Mert.prop.treat.glmmtmb) #summary of model results
## Family: binomial ( logit )
## Formula:
## cbind(dev.seed, undev.seeds) ~ treat + (1 | site/plot.treat)
## Data: mert
##
## AIC BIC logLik deviance df.resid
## 770.7 780.8 -381.3 762.7 89
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## plot.treat:site (Intercept) 0.12831 0.3582
## site (Intercept) 0.02192 0.1481
## Number of obs: 93, groups: plot.treat:site, 8; site, 4
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.62111 0.15662 3.966 7.32e-05 ***
## treatopen-hand -0.06824 0.07032 -0.970 0.332
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
We did not detect an effect of pollen supplementation on the proportions of developed seeds for Mertensia individuals.
We again checked to see if the data were overdispersed.
mert.prop.treat.simulation<-simulateResiduals(fittedModel = Mert.prop.treat.glmmtmb) #creating simulation for Mertensia mixed effects model with DHARMa package
plot(mert.prop.treat.simulation) #plotting simulation
testDispersion(mert.prop.treat.simulation) #checking for overdispersion
##
## DHARMa nonparametric dispersion test via sd of residuals fitted
## vs. simulated
##
## data: simulationOutput
## ratioObsSim = 1.0089, p-value = 0.952
## alternative hypothesis: two.sided
testZeroInflation(mert.prop.treat.simulation) #checking for zero inflation
##
## DHARMa zero-inflation test via comparison to expected zeros with
## simulation under H0 = fitted model
##
## data: simulationOutput
## ratioObsSim = 0.99128, p-value = 1
## alternative hypothesis: two.sided
Our pollen limitation model for Mertensia proportions was not overdispersed or zero-inflated.
Below are the plots for Mertensia proportion data.
mert.open<-mert.open[!is.na(mert.open$prop.dev.seeds),] #removing NA values from proportion column
ggplot(mert.open, aes(x=mert.open$relative.position, y=mert.open$prop.dev.seeds, group=plot.treat)) +
labs(y="Proportion of Developed Seeds",x="Days Relative to Population Peak Bloom",title="Effect of Mertensia Blooming Time on Proportion of Developed Seeds") +
geom_point(aes(color=plot.treat),size=3, alpha = 0.8) +
scale_color_brewer(palette="Dark2") + labs(color="Plot Treatment") +
scale_color_manual(labels= c("control","accelerated"), values = c("control"="darkred","manip"="darkorange")) +
geom_smooth()
ggplot(mert.open, aes(x=mert.open$deviation, y=mert.open$prop.dev.seeds, group= mert.open$early.late)) +
labs(y="Proportion of Developed Seeds",x="Days Relative to Population Peak Bloom",title="Effect of Mertensia Deviation from Peak on Proportion of Developed Seeds") +
theme_classic() +
geom_point(size=3, alpha = 0.8, aes(color=early.late)) +
geom_smooth(method="glm",aes(color=early.late)) +
scale_color_brewer(palette="Dark2") +
labs(color="Before or After Peak") +
scale_color_manual(labels= c("before peak","after peak"), values = c("early"="darkred","late"="darkorange"))
Despite a marginally significant interaction effect, the effect of deviation on early vs. late individuals was not strong for Mertensia proportions of developed seeds.
ggplot(mert.open, aes(x=mert.open$number.conspecifics, y=mert.open$prop.dev.seeds, group= mert.open$plot.treat)) +
labs(y="Proportion of Developed Seeds",x="Conspecific Density",title="Effect of Mertensia Conspecific Density on Proportion of Developed Seeds") +
theme_classic() +
geom_point(size=3, alpha = 0.8, aes(color=plot.treat)) +
geom_smooth(method="glm",aes(color=plot.treat)) +
scale_color_brewer(palette="Dark2") +
labs(color="Plot Treatment") +
scale_color_manual(labels= c("control","accelerated snowmelt"), values = c("control"="darkgreen","manip"="blue"))
We had to find the total developed seeds and undeveloped seeds before creating the model. To do this, we combined the seed counts of the first flower in bloom with the rest of the flowers on the plant.
delph.open$dev.seed.total<-delph.open$dev.seed+delph.open$dev.seed1 #creating developed seeds column
delph.open$undev.seed.total<-delph.open$undev.seed+delph.open$undev.seed1 #creating undeveloped seeds column
Delph.prop.glmmtmb<-glmmTMB(cbind(dev.seed.total,undev.seed.total) ~ deviation * early.late + plot.treat * number.conspecifics + (1|site/plot.treat), family = binomial, data = delph.open) #modeling Delphinium proportion of developed seeds with glmmTMB package
#removed treat fixed effect (only open)
summary(Delph.prop.glmmtmb)
## Family: binomial ( logit )
## Formula:
## cbind(dev.seed.total, undev.seed.total) ~ deviation * early.late +
## plot.treat * number.conspecifics + (1 | site/plot.treat)
## Data: delph.open
##
## AIC BIC logLik deviance df.resid
## 636.6 652.0 -309.3 618.6 32
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## plot.treat:site (Intercept) 7.524e-02 2.743e-01
## site (Intercept) 7.711e-10 2.777e-05
## Number of obs: 41, groups: plot.treat:site, 7; site, 4
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.219283 0.324446 -0.676 0.49912
## deviation 0.018210 0.034758 0.524 0.60035
## early.latelate 0.523356 0.382891 1.367 0.17167
## plot.treatmanip 1.194048 0.428956 2.784 0.00538
## number.conspecifics 0.008643 0.005277 1.638 0.10147
## deviation:early.latelate 0.120395 0.075438 1.596 0.11050
## plot.treatmanip:number.conspecifics -0.021124 0.006862 -3.079 0.00208
##
## (Intercept)
## deviation
## early.latelate
## plot.treatmanip **
## number.conspecifics
## deviation:early.latelate
## plot.treatmanip:number.conspecifics **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
We detected significant effects of plot treatment and the interaction between plot treatment and the number of conspecifics. Delphinium individuals in the manipulated plot had significantly higher seed set than individuals in the control plot.
We again tested for overdispersion and zero inflation. We used the DHARMa package for the Delphinium proportion data.
delph.prop.simulation<-simulateResiduals(fittedModel = Delph.prop.glmmtmb) #creating simulation for Delphinium model
plot(delph.prop.simulation) #plotting simulation
testDispersion(delph.prop.simulation) #checking for overdispersion
##
## DHARMa nonparametric dispersion test via sd of residuals fitted
## vs. simulated
##
## data: simulationOutput
## ratioObsSim = 1.1765, p-value < 2.2e-16
## alternative hypothesis: two.sided
testZeroInflation(delph.prop.simulation) #checking for zero inflation
##
## DHARMa zero-inflation test via comparison to expected zeros with
## simulation under H0 = fitted model
##
## data: simulationOutput
## ratioObsSim = 13.889, p-value < 2.2e-16
## alternative hypothesis: two.sided
Our Delphinium proportion data is overdispersed and zero-inflated. We adjusted our model to correct for these issues. To fix overdispersion, we are using a betabinomial family, and we added a zero-inflation formula to correct zero-inflation.
Delph.prop.glmmtmb<-glmmTMB(cbind(dev.seed.total,undev.seed.total) ~ deviation * early.late + plot.treat * number.conspecifics + (1|site/plot.treat), ziformula=~1, family = betabinomial, data = delph.open) #modeling Delphinium proportion of developed seeds with betabinomial family and ziformula
summary(Delph.prop.glmmtmb) #summary of model output
## Family: betabinomial ( logit )
## Formula:
## cbind(dev.seed.total, undev.seed.total) ~ deviation * early.late +
## plot.treat * number.conspecifics + (1 | site/plot.treat)
## Zero inflation: ~1
## Data: delph.open
##
## AIC BIC logLik deviance df.resid
## 335.3 354.1 -156.6 313.3 30
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## plot.treat:site (Intercept) 3.331e-02 1.825e-01
## site (Intercept) 1.754e-09 4.188e-05
## Number of obs: 41, groups: plot.treat:site, 7; site, 4
##
## Overdispersion parameter for betabinomial family (): 6.71
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.451749 0.580102 -0.779 0.436
## deviation 0.069194 0.094803 0.730 0.465
## early.latelate 0.633129 0.828253 0.764 0.445
## plot.treatmanip 0.578365 0.743927 0.777 0.437
## number.conspecifics 0.004381 0.008697 0.504 0.614
## deviation:early.latelate 0.053072 0.189552 0.280 0.779
## plot.treatmanip:number.conspecifics -0.009399 0.012232 -0.768 0.442
##
## Zero-inflation model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.572 1.013 -3.527 0.00042 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
After correcting for overdispersion and zero-inflation, we did not detect an effect of relative blooming time, conspecific density, or plot treatment on the proportion of developed seeds for Delphinium individuals.
We again checked for overdispersion and zero-inflation in the new model.
delph.prop.simulation<-simulateResiduals(fittedModel = Delph.prop.glmmtmb) #creating simulation for Delphinium model
plot(delph.prop.simulation) #plotting simulation
testDispersion(delph.prop.simulation) #checking for overdispersion
##
## DHARMa nonparametric dispersion test via sd of residuals fitted
## vs. simulated
##
## data: simulationOutput
## ratioObsSim = 1.1543, p-value = 0.104
## alternative hypothesis: two.sided
testZeroInflation(delph.prop.simulation) #checking for zero inflation
##
## DHARMa zero-inflation test via comparison to expected zeros with
## simulation under H0 = fitted model
##
## data: simulationOutput
## ratioObsSim = 1.5291, p-value = 0.744
## alternative hypothesis: two.sided
The data are no longer overdispersed or zero-inflated.
We created the mixed effects model for the pollen supplemented Delphinium individuals. Like the Mertensia model above, site and plot treatment are random effects, pollen limitation treatment is the fixed effect, and proportion of developed seeds is the response variable.
delph$dev.seed.total<-delph$dev.seed+delph$dev.seed1 #creating developed seeds column
delph$undev.seed.total<-delph$undev.seed+delph$undev.seed1 #creating undeveloped seeds column
Delph.prop.treat.glmmtmb<-glmmTMB(cbind(dev.seed.total,undev.seed.total) ~ treat + (1|site/plot.treat), family = binomial, data = delph) #modeling pollen lim and proportion of developed seeds with glmmTMB package
summary(Delph.prop.treat.glmmtmb) #model summary
## Family: binomial ( logit )
## Formula:
## cbind(dev.seed.total, undev.seed.total) ~ treat + (1 | site/plot.treat)
## Data: delph
##
## AIC BIC logLik deviance df.resid
## 1230.2 1240.0 -611.1 1222.2 80
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## plot.treat:site (Intercept) 0.04842 0.2200
## site (Intercept) 0.19174 0.4379
## Number of obs: 84, groups: plot.treat:site, 7; site, 4
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.50207 0.23990 2.093 0.036364 *
## treatopen-hand 0.20209 0.05495 3.678 0.000235 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Delphinium proportions of developed seeds were significantly affected by pollen supplementation. Pollen supplementation significantly increased the proportion of developed seeds.
Below are our simulations for checking overdispersion and zero-inflation.
delph.prop.treat.simulation<-simulateResiduals(fittedModel = Delph.prop.treat.glmmtmb) #creating simulation for Delphinium model
plot(delph.prop.treat.simulation) #plotting simulation
testDispersion(delph.prop.treat.simulation) #checking for overdispersion
##
## DHARMa nonparametric dispersion test via sd of residuals fitted
## vs. simulated
##
## data: simulationOutput
## ratioObsSim = 1.1804, p-value = 0.016
## alternative hypothesis: two.sided
testZeroInflation(delph.prop.treat.simulation) #checking for zero inflation
##
## DHARMa zero-inflation test via comparison to expected zeros with
## simulation under H0 = fitted model
##
## data: simulationOutput
## ratioObsSim = 3.7594, p-value < 2.2e-16
## alternative hypothesis: two.sided
The pollen limitation model for Delphinium proportion data is overdispersed and zero-inflated. As with the model above, we changed the family to beta binomial and included the zero-inflation formula.
Delph.prop.treat.glmmtmb<-glmmTMB(cbind(dev.seed.total,undev.seed.total) ~ treat + (1|site/plot.treat), ziformula=~1, family = betabinomial, data = delph) #modeling pollen lim and proportion of developed seeds with glmmTMB
summary(Delph.prop.treat.glmmtmb) #model summary
## Family: betabinomial ( logit )
## Formula:
## cbind(dev.seed.total, undev.seed.total) ~ treat + (1 | site/plot.treat)
## Zero inflation: ~1
## Data: delph
##
## AIC BIC logLik deviance df.resid
## 654.0 668.6 -321.0 642.0 78
##
## Random effects:
##
## Conditional model:
## Groups Name Variance Std.Dev.
## plot.treat:site (Intercept) 2.766e-08 0.0001663
## site (Intercept) 1.777e-01 0.4215895
## Number of obs: 84, groups: plot.treat:site, 7; site, 4
##
## Overdispersion parameter for betabinomial family (): 6.89
##
## Conditional model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.4443 0.2504 1.774 0.076 .
## treatopen-hand 0.1702 0.1764 0.965 0.335
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Zero-inflation model:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.6522 0.7245 -5.041 4.63e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
After correcting the model, we did not detect an effect of pollen limitation on the proportion of developed seeds for Delphinium individuals. Again we checked for overdispersion and zero-inflation.
delph.prop.treat.simulation<-simulateResiduals(fittedModel = Delph.prop.treat.glmmtmb) #creating simulation for Delphinium model
plot(delph.prop.treat.simulation) #plotting simulation
testDispersion(delph.prop.treat.simulation) #checking for overdispersion
##
## DHARMa nonparametric dispersion test via sd of residuals fitted
## vs. simulated
##
## data: simulationOutput
## ratioObsSim = 1.0861, p-value = 0.264
## alternative hypothesis: two.sided
testZeroInflation(delph.prop.treat.simulation) #checking for zero inflation
##
## DHARMa zero-inflation test via comparison to expected zeros with
## simulation under H0 = fitted model
##
## data: simulationOutput
## ratioObsSim = 1.227, p-value = 0.848
## alternative hypothesis: two.sided
The data are no longer overdispersed or zero-inflated.
Below are the plots for the proportion of developed seeds in Delphinium individuals.
delph.open<-delph.open[!is.na(delph.open$prop.dev.seeds),] #removing NA values in proportion column
ggplot(delph.open, aes(x=delph.open$relative.position, y=delph.open$prop.dev.seeds, group=plot.treat)) +
labs(title="Effect of Delphinium Blooming Time on Proportion of Developed Seeds", y="Proportion of Developed Seeds",x="Days Relative to Population Peak Bloom") +
geom_point(aes(color=plot.treat),size=3, alpha = 0.8) +
scale_color_brewer(palette="Dark2") + labs(color="Plot Treatment") +
scale_color_manual(labels= c("control","accelerated"), values = c("control"="darkred","manip"="darkorange")) +
geom_smooth()
ggplot(delph.open, aes(x=delph.open$deviation, y=delph.open$prop.dev.seeds, group= delph.open$early.late)) +
labs(y="Proportion of Developed Seeds",x="Days Relative to Population Peak Bloom",title="Effect of Delphinium Deviation from Peak on Proportion of Developed Seeds") +
theme_classic() +
geom_point(size=3, alpha = 0.8, aes(color=early.late)) +
geom_smooth(method="glm",aes(color=early.late)) +
scale_color_brewer(palette="Dark2") +
labs(color="Before or After Peak") +
scale_color_manual(labels= c("before peak","after peak"), values = c("early"="darkred","late"="darkorange"))
ggplot(delph.open, aes(x=delph.open$number.conspecifics, y=delph.open$prop.dev.seeds, group= delph.open$plot.treat)) +
labs(y="Proportion of Developed Seeds",x="Conspecific Density",title="Effect of Delphinium Conspecific Density on Proportion of Developed Seeds") +
theme_classic() +
geom_point(size=3, alpha = 0.8, aes(color=plot.treat)) +
geom_smooth(method="glm",aes(color=plot.treat)) +
scale_color_brewer(palette="Dark2") +
labs(color="Plot Treatment") +
scale_color_manual(labels= c("control","accelerated snowmelt"), values = c("control"="darkgreen","manip"="blue")) + xlim(0,110)
sessionInfo()
## R version 3.5.1 (2018-07-02)
## Platform: x86_64-apple-darwin15.6.0 (64-bit)
## Running under: macOS 10.15.2
##
## Matrix products: default
## BLAS: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib
##
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] glmmTMB_1.0.1 DHARMa_0.3.0 lubridate_1.7.4
## [4] MuMIn_1.43.6 glmmADMB_0.8.3.3 fitdistrplus_1.0-14
## [7] npsurv_0.4-0 lsei_1.2-0 survival_2.42-3
## [10] MASS_7.3-50 RColorBrewer_1.1-2 lme4_1.1-21
## [13] Matrix_1.2-14 forcats_0.3.0 stringr_1.3.1
## [16] dplyr_0.8.3 purrr_0.3.2 readr_1.1.1
## [19] tidyr_1.0.0 tibble_2.1.3 ggplot2_3.0.0
## [22] tidyverse_1.2.1 knitr_1.20
##
## loaded via a namespace (and not attached):
## [1] nlme_3.1-137 doParallel_1.0.15 httr_1.4.1
## [4] rprojroot_1.3-2 tools_3.5.1 TMB_1.7.16
## [7] backports_1.1.2 R6_2.3.0 lazyeval_0.2.1
## [10] mgcv_1.8-31 colorspace_1.3-2 withr_2.1.2
## [13] tidyselect_0.2.5 compiler_3.5.1 cli_1.0.1
## [16] rvest_0.3.4 xml2_1.2.2 spaMM_3.1.27
## [19] labeling_0.3 scales_1.0.0 pbapply_1.4-2
## [22] proxy_0.4-23 digest_0.6.17 minqa_1.2.4
## [25] rmarkdown_1.10 pkgconfig_2.0.2 htmltools_0.3.6
## [28] rlang_0.4.0 readxl_1.1.0 rstudioapi_0.8
## [31] shiny_1.1.0 R2admb_0.7.16 generics_0.0.2
## [34] jsonlite_1.6 magrittr_1.5 Rcpp_1.0.2
## [37] munsell_0.5.0 lifecycle_0.1.0 stringi_1.2.4
## [40] yaml_2.2.0 plyr_1.8.4 grid_3.5.1
## [43] parallel_3.5.1 qgam_1.3.2 promises_1.0.1
## [46] crayon_1.3.4 lattice_0.20-35 haven_1.1.2
## [49] splines_3.5.1 hms_0.4.2 zeallot_0.1.0
## [52] pillar_1.4.2 boot_1.3-20 codetools_0.2-15
## [55] stats4_3.5.1 glue_1.3.0 evaluate_0.11
## [58] modelr_0.1.5 vctrs_0.2.0 nloptr_1.2.1
## [61] httpuv_1.4.5 foreach_1.5.0 cellranger_1.1.0
## [64] gtable_0.2.0 assertthat_0.2.0 mime_0.5
## [67] xtable_1.8-3 broom_0.5.2 coda_0.19-1
## [70] later_0.7.5 iterators_1.0.12 gap_1.2.2